package com.arcusys.liferay.vaadinplugin.ui;
/*
* #%L
* Liferay Vaadin Plugin
* %%
* Copyright (C) 2010 - 2013 Vaadin Ltd.
* Copyright (C) 2013 Arcusys Ltd.
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import java.util.Collection;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import com.arcusys.liferay.vaadinplugin.ControlPanelUI;
import com.arcusys.liferay.vaadinplugin.util.DownloadInfo;
import com.arcusys.liferay.vaadinplugin.util.VaadinVersionFetcher;
import com.arcusys.liferay.vaadinplugin.util.VersionStorage;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.vaadin.data.Container;
import com.vaadin.data.Item;
import com.vaadin.data.Property;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.ui.Button;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Notification;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.ProgressIndicator;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;
public class ChangeVersionWindow extends Window {
private static final Log log = LogFactoryUtil.getLog(ChangeVersionWindow.class);
private static final String VERSION_PROPERTY = "name";
private static final String RELEASE_TYPE_PROPERTY = "releaseType";
private Thread versionFetch = new Thread() {
private List<DownloadInfo> getVersions() {
VersionStorage versionStorage = ((ControlPanelUI)getUI()).getVersionStorage();
List<DownloadInfo> versionList = versionStorage.getVersions();
if (versionList == null) {
long cacheLifeTime = 1L*60*60*1000;
versionList = new VaadinVersionFetcher().fetchAllVersionList();
versionStorage.setVersions(versionList, cacheLifeTime);
}
return versionList;
}
@Override
public void run() {
try {
List<DownloadInfo> versionList = getVersions();
getUI().getSession().getLockInstance().lock();
beanItemContainer.addAll(versionList);
updateState(true);
getUI().getSession().getLockInstance().unlock();
} catch (Exception e) {
log.warn("Version list could not be downloaded", e);
getUI().getSession().getLockInstance().lock();
layout.removeAllComponents();
layout.addComponent(new Label( "Version list could not be downloaded: " + e.getMessage()));
getUI().getSession().getLockInstance().unlock();
} finally {
// Release memory
versionFetch = null;
}
}
};
private final VerticalLayout layout = new VerticalLayout();
private final BeanItemContainer<DownloadInfo> beanItemContainer = new BeanItemContainer<DownloadInfo>(
DownloadInfo.class);
private final OptionGroup includeVersions = new OptionGroup(
"Also include non-stable versions", EnumSet.of(
DownloadInfo.VaadinReleaseType.prerelease, DownloadInfo.VaadinReleaseType.nightly));
private final ProgressIndicator progressIndicator = new ProgressIndicator();
private final ComboBox versionSelection = new ComboBox("Select version", beanItemContainer);
private final Button changeVersionButton = new Button("Change version",
new Button.ClickListener() {
public void buttonClick(Button.ClickEvent event) {
DownloadInfo version = (DownloadInfo) versionSelection.getValue();
if (version == null) {
Notification.show("Please select a version");
return;
}
ControlPanelUI mainUI = (ControlPanelUI) getUI();
mainUI.showWarningWindow(version);
close();
}
});
private final Button cancelButton = new Button("Cancel",
new Button.ClickListener() {
public void buttonClick(Button.ClickEvent event) {
close();
}
});
public ChangeVersionWindow() {
super("Change Vaadin version");
setModal(true);
setSizeUndefined();
layout.setMargin(true);
layout.setSizeUndefined();
layout.setSpacing(true);
setContent(layout);
progressIndicator.setCaption("Fetching version list");
includeVersions.setItemCaptionMode(ComboBox.ItemCaptionMode.ID);
includeVersions.setMultiSelect(true);
includeVersions.setValue(Collections
.singleton(DownloadInfo.VaadinReleaseType.release));
includeVersions.setImmediate(true);
includeVersions.addValueChangeListener(new Property.ValueChangeListener() {
public void valueChange(Property.ValueChangeEvent event) {
updateFilter();
}
});
versionSelection.setItemCaptionPropertyId(VERSION_PROPERTY);
versionSelection.setNullSelectionAllowed(false);
versionSelection.setRequired(true);
//versionFetch.start();
layout.addComponent(includeVersions);
layout.addComponent(versionSelection);
HorizontalLayout buttonRow = new HorizontalLayout();
buttonRow.setSpacing(true);
buttonRow.addComponent(changeVersionButton);
buttonRow.addComponent(cancelButton);
layout.addComponent(buttonRow);
updateState(false);
updateFilter();
}
public void initialize() {
versionFetch.start();
}
private void updateFilter() {
@SuppressWarnings("unchecked")
final Collection<DownloadInfo.VaadinReleaseType> types = (Collection<DownloadInfo.VaadinReleaseType>) includeVersions
.getValue();
beanItemContainer.removeAllContainerFilters();
beanItemContainer.addContainerFilter(new Container.Filter() {
public boolean passesFilter(Object itemId, Item item)
throws UnsupportedOperationException {
Object releaseType = item
.getItemProperty(RELEASE_TYPE_PROPERTY).getValue();
return releaseType == DownloadInfo.VaadinReleaseType.release
|| types.contains(releaseType);
}
public boolean appliesToProperty(Object propertyId) {
return RELEASE_TYPE_PROPERTY.equals(propertyId);
}
});
}
private void updateState(boolean enabled) {
versionSelection.setEnabled(enabled);
includeVersions.setEnabled(enabled);
changeVersionButton.setEnabled(enabled);
cancelButton.setEnabled(enabled);
if (enabled && progressIndicator.getParent() != null) {
layout.removeComponent(progressIndicator);
} else if (!enabled && progressIndicator.getParent() == null) {
layout.addComponent(progressIndicator, 0);
}
}
}